package com.gaofei.sysmanager.service.impl;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * @Classname AttchImgMail
 * @Description TODO
 * @Date 2022/4/20 11:38
 * @Created by 93173
 */
public class AttchImgMail {
    // JavaMail须要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host"，属性值就是发送邮件的主机.
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        // properties.put("mail.smtp.host", "mailcas.chinapnr.com");// 设置smtp主机
        properties.put("mail.smtp.host", "smtp.163.com");// 设置smtp主机
        properties.put("mail.smtp.auth", "true");// 使用smtp身份验证
        /*
         * 在 JavaMail 中，能够通过 extends Authenticator 抽象类，在子类中覆盖父类中的
         * getPasswordAuthentication() 方法。就能够实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail
         * 中的这样的设计是使用了策略模式（Strategy
         */
        MimeMessage message = new MimeMessage(Session.getInstance(properties,
                new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(//设置发送帐号password
                                "junjie0608_w@163.com", "KASNCVNHBGJOXSHQ");
                    }
                }));
        // 设置邮件的属性
        // 设置邮件的发件人
        message.setFrom(new InternetAddress("junjie0608_w@163.com"));
        // 设置邮件的收件人 cc表示抄送 bcc 表示暗送
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(
                "15631382687@163.com"));
        // 设置邮件的主题
        message.setSubject("系统自己主动发送邮件");
        // 创建邮件的正文
        MimeBodyPart text = new MimeBodyPart();

        String HtmlTemplateStr = readFile("C:\\Users\\93173\\Documents\\WeChat Files\\wxid_7nnid3kbw9lc12\\FileStorage\\File\\2022-04\\Html.txt");
        // setContent(“邮件的正文内容”,”设置邮件内容的编码方式”)
        /*text.setContent("此邮件为系统自己主动发送<img src='cid:a'><img src='cid:b'>",
                "text/html;charset=gb2312");*/
        text.setContent(HtmlTemplateStr+"<img src='cid:b'>","text/html;charset=UTF-8");

        // 点到点的发送
        // 一对多发送仅仅要改一个地方例如以下：

        // // 构建一个群发地址数组
        // InternetAddress[] adr=new InternetAddress[toMore.length];
        // for(int i=0;i<toMore.length;i++){ adr[i]=new
        // InternetAddress(toMore[i]); }
        // // Message的setRecipients方法支持群发。。注意:setRecipients方法是复数和点 到点不一样
        // message.setRecipients(Message.RecipientType.TO,adr);


        // 创建图片
        MimeBodyPart img = new MimeBodyPart();
        /*
         * JavaMail API不限制信息仅仅为文本,不论什么形式的信息都可能作茧自缚MimeMessage的一部分.
         * 除了文本信息,作为文件附件包括在电子邮件信息的一部分是非常普遍的. JavaMail
         * API通过使用DataHandler对象,提供一个同意我们包括非文本BodyPart对象的简便方法.
         */
//        E:\iphone\63778801447670.png
        DataHandler dh = new DataHandler(new FileDataSource(""));//图片路径
        img.setDataHandler(dh);
        // 创建图片的一个表示用于显示在邮件中显示
        img.setContentID("a");

        MimeBodyPart img2 = new MimeBodyPart();
        DataHandler dh2 = new DataHandler(new FileDataSource("E:\\iphone\\lcxq1.png"));//第二张图片路径
        img2.setDataHandler(dh2);
        img2.setContentID("b");
        // 创建附件
        // MimeBodyPart attch = new MimeBodyPart();
        // DataHandler dh1 = new DataHandler(new FileDataSource("src//b.jpg"));
        // attch.setDataHandler(dh1);
        // String filename1 = dh1.getName();
        // MimeUtility 是一个工具类，encodeText（）用于处理附件字，防止中文乱码问题
        // attch.setFileName(MimeUtility.encodeText(filename1));
        // 关系 正文和图片的
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(img);
        mm.setSubType("related");// 设置正文与图片之间的关系
        // 图班与正文的 body
        MimeBodyPart all = new MimeBodyPart();
        all.setContent(mm);
        // 附件与正文（text 和 img）的关系
        MimeMultipart mm2 = new MimeMultipart();
        mm2.addBodyPart(all);
        mm2.addBodyPart(img2);
        mm2.setSubType("mixed");// 设置正文与附件之间的关系

        message.setContent(mm2);
        message.saveChanges(); // 保存改动

        Transport.send(message);// 发送邮件
        System.out.println("邮件发送成功");

    }


    public static String readFile(String filePath){
        FileInputStream fis=null;
        String result = "" ;
        try {
            // 根据path路径实例化一个输入流的对象
            fis  = new FileInputStream( filePath );

            //2. 返回这个输入流中可以被读的剩下的bytes字节的估计值；
            int size =  fis.available() ;
            //3. 根据输入流中的字节数创建byte数组；
            byte[] array = new byte[size];
            //4.把数据读取到数组中；
            fis.read( array ) ;

            //5.根据获取到的Byte数组新建一个字符串，然后输出；
            result = new String(array);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            if ( fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return result ;
    }
}
